﻿// Inner Fire 游戏引擎库
// 简单地图类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 简单的设置地图类型
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-11

#pragma once

#include <DirectXMath.h>
#include <EASTL/vector.h>
#include <cstdint>
#include <kits.h>
#include <xml_reader.h>
#include <static_string.h>
#include <EASTL/string_view.h>
#include <memory>

using namespace ikit;
using namespace DirectX;

namespace ifire::game {
struct MapProp {
  int id;
  int type;
};

template <typename T> class MapGrid {
private:
  size_t width, height;
  eastl::vector<T> data; // 连续内存块

public:
  // TIPS:C++初始化居然是按照在类中定义的顺序，而不是在构造函数中的初始化列表的程序！
  // 以前我居然没有注意到这一点。非常重要。
  MapGrid(size_t _width, size_t _height)
      : width(_width), height(_height), data(_width * _height) {}

  inline T& at(size_t x, size_t y) {
    return data[y * width + x];
  }

  inline T& at(size_t index) {
    return data[index];
  }

  inline void set(size_t x, size_t y, T value) {
    data[y * width + x] = value;
  }

  inline size_t size() const { return data.size(); }

  // 直接访问底层数据（用于批量操作）
  T* grid() { return data.data(); }
};


class SimpleMap {
public:
  SimpleMap(const eastl::string_view& filename);
  SimpleMap(const SimpleMap& rhs) = delete;
  SimpleMap& operator=(const SimpleMap& rhs) = delete;
  ~SimpleMap();

  int GetTerrainCount() const { return size; }

public:
  ikit::sstr name;
  int width;
  int height;
  int size;
  std::unique_ptr<MapGrid<int>> heights;
  std::unique_ptr<MapGrid<int>> terrain;
  std::unique_ptr<MapGrid<MapProp>> props;

};

using SimpleMapPtr = std::unique_ptr<SimpleMap>;

} // namespace ifire::game